2 dotazy pro systemove programatory.

Otázka od: Petr Vařeka

18. 10. 2002 18:21

Zdravim obec tech, kteri se pokouseji stavet zamky z bitu a zaroven vznasim
2 otazky:

1) Aplikace v Delphi (ktera prohlizi usek operacni pameti, v nemz je
natazena) konci planovanou vyjimkou na adrese 4AC14C (EAccessViolation). Byl
jsem zvedav na ktere adrese zhavaruje 2. instance teto aplikace.
Ocekaval jsem, ze to bude uplne jinde, ponevadz druha instance se musi
natahnout do jineho adresniho
rozmezi. K memu prekvapeni KONCI NA STEJNE ADRESE 4AC14C a navic je natazena
do stejneho useku
pameti 400000-4CBFFF.
Jak je mozne, ze 2 instance teze aplikace bezi nad tymz usekem pameti ? Bezi
tam skutecne ?

Vysvetli mi to nekdo ?


2) Kdysi jsem programoval v assembleru na IBM360. Prvni byte prelozene
instrukce tam znacil kod operace
    (a dal tam byly vselijake atributy, resp. adresy operandu)
    Byl jsem zvedav jak vypada situace ted. Spustil jsem tedy v Debbugeru
CPU okno (na vyse uvedene adrese
    vyse zminene aplikace) a spatril jsem tam nasl. kod:

    4AC147 A1BC0E4B00 mov eax, [U]
    4AC14C C6004C mov byte, ptr [eax], $4c //
Zhavarovana instrukce na adrese z bodu 1)

Je videt, ze prelozeny kod u obou instrukci MOV je naprosto rozdilny. Jakou
ma MOV vlastne strukturu ?
Je tam taky nekde kod operace ? Kde ?


S pozdravem Petr Vareka.


Odpovedá: Lukas Gebauer

18. 10. 2002 17:35

> 1) Aplikace v Delphi (ktera prohlizi usek operacni pameti, v nemz je
> natazena) konci planovanou vyjimkou na adrese 4AC14C
> (EAccessViolation). Byl jsem zvedav na ktere adrese zhavaruje 2.
> instance teto aplikace. Ocekaval jsem, ze to bude uplne jinde,
> ponevadz druha instance se musi natahnout do jineho adresniho rozmezi.
> K memu prekvapeni KONCI NA STEJNE ADRESE 4AC14C a navic je natazena do
> stejneho useku pameti 400000-4CBFFF. Jak je mozne, ze 2 instance teze
> aplikace bezi nad tymz usekem pameti ? Bezi tam skutecne ?
>
> Vysvetli mi to nekdo ?

zjednodusene receno:
Pod Win32 bezi kazda aplikace ve svem vlastnim virtualnim adresovem
prostoru. Tedy system vytvori kazdemu procesu jakoby svou vlastni
pamet o velikosti 4 giga, ve ktere si apliakce zije svym vlastnm
zivotem. (a take se v tom adresovem prostoru objevi vsechny potrebne
sdilene knihovny, takze vse co potrebuje aplikace k zivotu, ma ve
svem virtualnim prostoru k dispozic a npotrebuje tedy nic mimo!)

Diky tomu nemuze aplikace zasahnout do adresoveho prostoru jine
aplikace a nejak ji poskodit.

A tak tedy pustis-li dve stejne apliakce, bezi kazde ve svem vlastnim
adresovem prostoru. Ale protoze jsou ty apliakce stejne a delaji
totez, nejak neni sebemensi duvod k tomu, aby byly v tom vlastnim
virtualnim adresovem prostoru nahrany jinak.



-- Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Synapse Delphi and Kylix TCP/IP Lib.

Odpovedá: Petr Vones

18. 10. 2002 18:06

From: "Petr Vařeka" <pvareka@mujmejl.cz>
> Ocekaval jsem, ze to bude uplne jinde, ponevadz druha instance se musi
> natahnout do jineho adresniho
> rozmezi. K memu prekvapeni KONCI NA STEJNE ADRESE 4AC14C a navic je natazena
> do stejneho useku
> pameti 400000-4CBFFF.
> Jak je mozne, ze 2 instance teze aplikace bezi nad tymz usekem pameti ? Bezi
> tam skutecne ?

Kazdy proces ma svuj privatni virtualni adresovy prostor o velikosti 4GB.
Adresy tedy nemaji nic spolecneho s fyzickou RAM. Operacni system rozhoduje
sam o tom, ktere stranky (o velikosti 4k) budou zrovna umisteny v RAM a ktere
na disku (bud jako page file nebo mapped file). Smyslem je, ze jeden proces
nesmi mit moznost jakkoli narusit adresovy prostor ostatnich procesu. Toto je
splneno v implementaci Win32 API na Windows NT (NT4/2000/XP), u 95/98/Me to ma
jiste zjednoduseni a z toho plynouci nestabilitu systemu.

> 2) Kdysi jsem programoval v assembleru na IBM360. Prvni byte prelozene
> instrukce tam znacil kod operace
> Je tam taky nekde kod operace ? Kde ?

http://www.intel.com/design/Pentium4/manuals/

Petr Vones